return {
  lua_ls = {
    settings = {
      Lua = {
        diagnostics = {
          global = { "vim" },
        },
        workspace = {
          library = vim.api.nvim_get_runtime_file("", true),
          checkThirdParty = false,
        },
      }
    }
  },
  clangd = {},
  neocmake = {},
  cssls = {},
  ts_ls = {},
  volar = {},
  pyright = {
    settings = {
      pyright = {
        disableOrganizeImports = true,
      },
      python = {
        analysis = {
          ignore = { "*" }
        }
      }
    }
  },
  ruff = {},
  rust_analyzer = {
    settings = {
      ["rust-analyzer"] = {
        checkOnSave = {
          command = "clippy"
        },
        imports = {
          granularity = {
            group = "module",
          },
          prefix = "self",
        },
        cargo = {
          buildScripts = {
            enable = true,
          },
        },
        procMacro = {
          enable = true
        },
      }
    }
  },
  omnisharp = {
    pre_setup = function(opt, lspconfig)
      opt.root_dir = function(name, _)
        local fun = lspconfig.util.root_pattern("*.csproj", "*.sln")
        local p = fun(name)
        return p
      end
      opt.on_attach = function(client, bufnr)
        vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
        local function toSnakeCase(str)
          return string.gsub(str, "%s*[- ]%s*", "_")
        end
        local tokenModifiers = client.server_capabilities.semanticTokensProvider.legend.tokenModifiers
        for i, v in ipairs(tokenModifiers) do
          tokenModifiers[i] = toSnakeCase(v)
        end
        local tokenTypes = client.server_capabilities.semanticTokensProvider.legend.tokenTypes
        for i, v in ipairs(tokenTypes) do
          tokenTypes[i] = toSnakeCase(v)
        end
      end
    end
  }
}
